package router

import (
	"KumquatDrivesServices/global"
	"context"
	"errors"
	"github.com/sirupsen/logrus"
	"net/http"
	"os"
	"os/signal"
	"time"

	"github.com/gin-gonic/gin"
)

func Run() {
	gin.SetMode(global.Config.System.GinModele)
	r := gin.Default()
	ApiRouterInit(r)
	srv := &http.Server{
		Addr:    global.Config.System.Addr(),
		Handler: r,
	}
	go func() {
		//服务连接
		if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
			logrus.Fatalf("  : %s\n", err)
		}
	}()
	// 等待中断信号以优雅地关闭服务器（设置 5 秒的超时时间）
	quit := make(chan os.Signal, 1)
	signal.Notify(quit, os.Interrupt)
	<-quit
	logrus.Warnf("关闭服务中...")
	ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
	defer cancel()
	if err := srv.Shutdown(ctx); err != nil {
		logrus.Fatalf("Http服务关闭失败: %v\n", err)
	}
	logrus.Warnf("Http服务关闭成功")
	if err := global.Redis.Close(); err != nil {
		logrus.Fatalf("Redis服务关闭失败: %v\n", err)
	}
	logrus.Warnf("Redis服务关闭成功")
	sqlDB, _ := global.DB.DB()
	if err := sqlDB.Close(); err != nil {
		logrus.Fatalf("数据库服务关闭失败: %v\n", err)
	}
	logrus.Warnf("数据库服务关闭成功")
	logrus.Warnf("关闭服务成功")
	os.Exit(1)
}
